package net.cassite.daf4j.ds;

import net.cassite.daf4j.Parameter;
import net.cassite.daf4j.ParameterAggregate;
import net.cassite.daf4j.ParameterComparable;
import net.cassite.daf4j.PreResult;

/**
 * 条件解释器
 *
 * @param <Context> 上下文类型
 */
public interface ConditionParser<Context, BasicElement> extends AdvancedParser<Context, BasicElement> {
        /**
         * 解释 大于 条件
         *
         * @param context 上下文
         * @param p       字段
         * @param a       参数1
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement gt(Context context, ParameterComparable<?> p, Object a) throws Exception;

        /**
         * 解释 小于 条件
         *
         * @param context 上下文
         * @param p       字段
         * @param a       参数1
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement lt(Context context, ParameterComparable<?> p, Object a) throws Exception;

        /**
         * 解释 等于 条件
         *
         * @param context 上下文
         * @param p       字段
         * @param a       参数1
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement eq(Context context, Parameter p, Object a) throws Exception;

        /**
         * 解释 大于等于 条件
         *
         * @param context 上下文
         * @param p       字段
         * @param a       参数1
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement ge(Context context, ParameterComparable<?> p, Object a) throws Exception;

        /**
         * 解释 小于等于 条件
         *
         * @param context 上下文
         * @param p       字段
         * @param a       参数1
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement le(Context context, ParameterComparable<?> p, Object a) throws Exception;

        /**
         * 解释 不等于 条件
         *
         * @param context 上下文
         * @param p       字段
         * @param a       参数1
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement ne(Context context, Parameter p, Object a) throws Exception;

        /**
         * 解释 between 条件
         *
         * @param context 上下文
         * @param p       字段
         * @param a       between起始
         * @param b       between结束
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement between(Context context, ParameterComparable<?> p, Object a, Object b) throws Exception;

        /**
         * 解释 in 条件
         *
         * @param context 上下文
         * @param p       字段
         * @param query   子查询
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement in(Context context, Parameter p, PreResult<?> query) throws Exception;

        /**
         * 解释 not in 条件
         *
         * @param context 上下文
         * @param p       字段
         * @param query   子查询
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement notIn(Context context, Parameter p, PreResult<?> query) throws Exception;

        /**
         * 解释 like 条件
         *
         * @param context 上下文
         * @param p       字段
         * @param strs    需要连接起来的字符串/字段
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement like(Context context, Parameter p, Object[] strs) throws Exception;

        /**
         * 解释 is null 条件
         *
         * @param context 上下文
         * @param p       字段
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement isNull(Context context, Parameter p) throws Exception;

        /**
         * 解释 is not null 条件
         *
         * @param context 上下文
         * @param p       字段
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement isNotNull(Context context, Parameter p) throws Exception;

        /**
         * 解释 member 条件
         *
         * @param context 上下文
         * @param p       字段
         * @param a       聚合型字段
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement member(Context context, Parameter p, ParameterAggregate a) throws Exception;

        /**
         * 解释 反member 条件
         *
         * @param context 上下文
         * @param p       聚合型字段
         * @param a       在该字段中的对象
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement reverseMember(Context context, ParameterAggregate p, Object a) throws Exception;

        /**
         * 解释 not member 条件
         *
         * @param context 上下文
         * @param p       字段
         * @param a       聚合型字段
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement notMember(Context context, Parameter p, ParameterAggregate a) throws Exception;

        /**
         * 解释 反not member 条件
         *
         * @param context 上下文
         * @param p       聚合型字段
         * @param a       在该字段中的对象
         * @return 基本元素
         * @throws Exception 可能的异常
         */
        BasicElement reverseNotMember(Context context, ParameterAggregate p, Object a) throws Exception;
}
